package com.lianqi.emcpframework.design.domain.aggregate;

import java.util.List;
import java.util.Optional;

/**
 * @program emcp-framework
 * @ClassName AggregateRepository
 * @description: 聚合根持久化接口定义
 * @author: sky
 * @create: 2019/06/08 15:29
 */
public interface AggregateRepository<ID, T, A extends Aggregate<T, ID>> {

    /**
     * 根据主键查找对象
     * 
     * @param id
     *            主键
     * @return
     */
    Optional<A> findById(ID id);

    /**
     * 根据主键集合 查询对象集合
     * 
     * @param ids
     *            主键集合
     * @return
     */
    List<A> findByIdIn(List<ID> ids);

    /**
     * 查询所有
     * 
     * @return
     */
    List<A> findAll();

    /**
     * 查询单个领域实体
     * 
     * @param entity
     * @return
     */
    A findOne(A entity);

    /**
     * 保存领域对象
     * 
     * @param entity
     */
    void save(A entity);

    /**
     * 更新领域对象
     * 
     * @param entity
     */
    void update(A entity);

    /**
     * 删除领域对象
     * 
     * @param entity
     */
    void delete(A entity);

    /**
     * 根据主键删除对象
     * 
     * @param id
     *            对象主键
     */
    default void deleteById(ID id) {
        Optional<A> aOptional = findById(id);
        aOptional.ifPresent(a -> delete(a));
    }
}
